home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / change1a / orient.bas < prev    next >
BASIC Source File  |  1999-08-29  |  8KB  |  185 lines

  1. Attribute VB_Name = "Orient"
  2. 'Constants used in the DevMode structure
  3. Private Const CCHDEVICENAME = 32
  4. Private Const CCHFORMNAME = 32
  5.  
  6. 'Constants for NT security
  7. Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
  8. Private Const PRINTER_ACCESS_ADMINISTER = &H4
  9. Private Const PRINTER_ACCESS_USE = &H8
  10. Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
  11.  
  12. 'Constants used to make changes to the values contained in the DevMode
  13. Private Const DM_MODIFY = 8
  14. Private Const DM_IN_BUFFER = DM_MODIFY
  15. Private Const DM_COPY = 2
  16. Private Const DM_OUT_BUFFER = DM_COPY
  17. Private Const DM_DUPLEX = &H1000&
  18. Private Const DMDUP_SIMPLEX = 1
  19. Private Const DMDUP_VERTICAL = 2
  20. Private Const DMDUP_HORIZONTAL = 3
  21. Private Const DM_ORIENTATION = &H1&
  22. Private PageDirection As Integer
  23. '------USER DEFINED TYPES
  24.  
  25. 'The DevMode structure contains printing parameters.
  26. 'Note that this only represents the PUBLIC portion of the DevMode.
  27. '  The full DevMode also contains a variable length PRIVATE section
  28. '  which varies in length and content between printer drivers.
  29. 'NEVER use this User Defined Type directly with any API call.
  30. '  Always combine it into a FULL DevMode structure and then send the
  31. '  full DevMode to the API call.
  32. Private Type DEVMODE
  33.     dmDeviceName As String * CCHDEVICENAME
  34.     dmSpecVersion As Integer
  35.     dmDriverVersion As Integer
  36.     dmSize As Integer
  37.     dmDriverExtra As Integer
  38.     dmFields As Long
  39.     dmOrientation As Integer
  40.     dmPaperSize As Integer
  41.     dmPaperLength As Integer
  42.     dmPaperWidth As Integer
  43.     dmScale As Integer
  44.     dmCopies As Integer
  45.     dmDefaultSource As Integer
  46.     dmPrintQuality As Integer
  47.     dmColor As Integer
  48.     dmDuplex As Integer
  49.     dmYResolution As Integer
  50.     dmTTOption As Integer
  51.     dmCollate As Integer
  52.     dmFormName As String * CCHFORMNAME
  53.     dmLogPixels As Integer
  54.     dmBitsPerPel As Long
  55.     dmPelsWidth As Long
  56.     dmPelsHeight As Long
  57.     dmDisplayFlags As Long
  58.     dmDisplayFrequency As Long
  59.     dmICMMethod As Long        ' // Windows 95 only
  60.     dmICMIntent As Long        ' // Windows 95 only
  61.     dmMediaType As Long        ' // Windows 95 only
  62.     dmDitherType As Long       ' // Windows 95 only
  63.     dmReserved1 As Long        ' // Windows 95 only
  64.     dmReserved2 As Long        ' // Windows 95 only
  65. End Type
  66.  
  67. Private Type PRINTER_DEFAULTS
  68. 'Note:
  69. '  The definition of Printer_Defaults in the VB5 API viewer is incorrect.
  70. '  Below, pDevMode has been corrected to LONG.
  71.     pDatatype As String
  72.     pDevMode As Long
  73.     DesiredAccess As Long
  74. End Type
  75.  
  76.  
  77. '------DECLARATIONS
  78.  
  79. Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
  80. Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command As Long) As Long
  81. Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long
  82. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  83. Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
  84.  
  85. 'The following is an unusual declaration of DocumentProperties:
  86. '  pDevModeOutput and pDevModeInput are usually declared ByRef.  They are declared
  87. '  ByVal in this program because we're using a Printer_Info_2 structure.
  88. '  The pi2 structure contains a variable of type LONG which contains the address
  89. '  of the DevMode structure (this is called a pointer).  This LONG variable must
  90. '  be passed ByVal.
  91. '  Normally this function is called with a BYTE ARRAY which contains the DevMode
  92. '  structure and the Byte Array is passed ByRef.
  93. Private Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" (ByVal hwnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, ByVal pDevModeOutput As Any, ByVal pDevModeInput As Any, ByVal fMode As Long) As Long
  94.  
  95. Private Sub SetOrientation(NewSetting As Long, chng As Integer, ByVal frm As Form)
  96.     Dim PrinterHandle As Long
  97.     Dim PrinterName As String
  98.     Dim pd As PRINTER_DEFAULTS
  99.     Dim MyDevMode As DEVMODE
  100.     Dim Result As Long
  101.     Dim Needed As Long
  102.     Dim pFullDevMode As Long
  103.     Dim pi2_buffer() As Long     'This is a block of memory for the Printer_Info_2 structure
  104.         'If you need to use the Printer_Info_2 User Defined Type, the
  105.         '  definition of Printer_Info_2 in the API viewer is incorrect.
  106.         '  pDevMode and pSecurityDescriptor should be defined As Long.
  107.     
  108.     PrinterName = Printer.DeviceName
  109.     If PrinterName = "" Then
  110.         Exit Sub
  111.     End If
  112.     
  113.     pd.pDatatype = vbNullString
  114.     pd.pDevMode = 0&
  115.     'Printer_Access_All is required for NT security
  116.     pd.DesiredAccess = PRINTER_ALL_ACCESS
  117.     
  118.     Result = OpenPrinter(PrinterName, PrinterHandle, pd)
  119.     
  120.     'The first call to GetPrinter gets the size, in bytes, of the buffer needed.
  121.     'This value is divided by 4 since each element of pi2_buffer is a long.
  122.     Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
  123.     ReDim pi2_buffer((Needed \ 4))
  124.     Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
  125.     
  126.     'The seventh element of pi2_buffer is a Pointer to a block of memory
  127.     '  which contains the full DevMode (including the PRIVATE portion).
  128.     pFullDevMode = pi2_buffer(7)
  129.     
  130.     'Copy the Public portion of FullDevMode into our DevMode structure
  131.     Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
  132.     
  133.     'Make desired changes
  134.     MyDevMode.dmDuplex = NewSetting
  135.     MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
  136.     MyDevMode.dmOrientation = chng
  137.     
  138.     'Copy our DevMode structure back into FullDevMode
  139.     Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
  140.     
  141.     'Copy our changes to "the PUBLIC portion of the DevMode" into "the PRIVATE portion of the DevMode"
  142.     Result = DocumentProperties(frm.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
  143.     
  144.     'Update the printer's default properties (to verify, go to the Printer folder
  145.     '  and check the properties for the printer)
  146.     Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
  147.     
  148.     Call ClosePrinter(PrinterHandle)
  149.     
  150.     'Note: Once "Set Printer = " is executed, anywhere in the code, after that point
  151.     '      changes made with SetPrinter will ONLY affect the system-wide printer  --
  152.     '      -- the changes will NOT affect the VB printer object.
  153.     '      Therefore, it may be necessary to reset the printer object's parameters to
  154.     '      those chosen in the devmode.
  155.     Dim p As Printer
  156.     For Each p In Printers
  157.         If p.DeviceName = PrinterName Then
  158.             Set Printer = p
  159.             Exit For
  160.         End If
  161.     Next p
  162.     Printer.Duplex = MyDevMode.dmDuplex
  163. End Sub
  164.  
  165. Public Sub ChngPrinterOrientationLandscape(ByVal frm As Form)
  166.     PageDirection = 2
  167.     Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
  168. End Sub
  169.  
  170. Public Sub ResetPrinterOrientation(ByVal frm As Form)
  171.  
  172.     If PageDirection = 1 Then
  173.         PageDirection = 2
  174.     Else
  175.         PageDirection = 1
  176.     End If
  177.     Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
  178. End Sub
  179.  
  180. Public Sub ChngPrinterOrientationPortrait(ByVal frm As Form)
  181.  
  182.     PageDirection = 1
  183.     Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
  184. End Sub
  185.